/*
 * @Author: enmotion 
 * @Date: 2025-07-02 17:22:00 
 * @Last Modified by: enmotion
 * @Last Modified time: 2025-07-02 17:22:00
 * 
 * 搜索任务集数据模型定义文件
 * @desc 定义搜索任务集核心数据结构和数据库Schema
 * @warning 所有时间字段由系统自动维护，禁止手动修改
 */

"use strict"
import { Document, SchemaDefinition } from 'mongoose';
import uniqid from "uniqid"

/**
 * 搜索任务集实体接口
 * @interface ISearchTask
 * @property {string} _id - 搜索任务ID
 * @property {string} cookieStr - 小红书登录cookie
 * @property {string} keywords - 搜索关键词
 * @property {number} noteType - 笔记查询类型（0=全部，1=视频，2=图文）
 * @property {number} sort - 排序规则（默认为综合，0=综合，1=最新，2=最热）
 * @property {number} totalNumber - 取样总量
 * @property {string} createdUser - 创建用户ID
 * @property {Date} createdAt - 记录创建时间(自动生成，不可修改)
 * @property {string} updatedUser - 最后修改人ID(用于操作审计)
 * @property {Date} updatedAt - 最后修改时间(自动更新)
 */
export interface ISearchTask {
  _id: string;                     // 搜索任务ID
  keywords: string;                // 搜索关键词
  noteType: number;                // 笔记查询类型（0=全部，1=视频，2=图文）
  sort: number;                    // 排序规则（默认为综合，0=综合，1=最新，2=最热）
  status: number;                  // 任务状态(0=待执行，1=执行中，2=已执行)
  totalNumber: number;             // 取样总量
  createdUser: string;             // 创建用户
  createdAt: Date;                 // 创建时间
  updatedUser: string;             // 修改用户
  updatedAt: Date;                 // 修改时间
}

/**
 * 搜索任务集文档类型
 * @typedef {Document<ISearchTask>} ISearchTaskDocument
 * @desc 扩展Mongoose Document类型，包含搜索任务集接口定义的所有字段
 */
export type ISearchTaskDocument = Document<ISearchTask>

/**
 * Mongoose Schema配置
 * @constant
 * @type {SchemaDefinition<ISearchTask>}
 * @property {Object} _id - 搜索任务唯一标识配置
 *   @property {String} type - 字段类型
 *   @property {Boolean} index - 建立索引加速查询
 *   @property {String} name - 字段显示名称
 *   @property {Array} unique - 唯一性约束及错误提示
 *   @property {Function} default - 默认值生成函数
 * @property {Object} cookieStr - 搜索任务唯一标识主键
 *   @property {String} type - 字段类型
 *   @property {Boolean} index - 建立索引加速查询
 *   @property {String} name - 字段显示名称
 *   @property {Array} unique - 唯一性约束及错误提示
 *   @property {Function} default - 默认值生成函数
 * @property {Object} keywords - 搜索任务关键词配置
 *   @property {String} type - 字段类型
 *   @property {String} name - 字段显示名称
 *   @property {Array} required - 必填约束及错误提示
 *   @property {Array} unique - 唯一性约束及错误提示
 *   @property {Number} maxlength - 最大长度限制
 * @property {Object} noteType - 搜索任务定义配置
 *   @property {String} type - 字段类型
 *   @property {String} name - 字段显示名称
 *   @property {Array} required - 必填约束及错误提示
 *   @property {Number} minlength - 最小长度限制
 *   @property {Number} maxlength - 最大长度限制
 * @property {Object} sort - 搜索任务范例配置
 *   @property {String} type - 字段类型
 *   @property {String} name - 字段显示名称
 *   @property {Array} required - 必填约束及错误提示
 *   @property {Number} minlength - 最小长度限制
 *   @property {Number} maxlength - 最大长度限制
 * @property {Object} totalNumber - 修改核心配置
 *   @property {String} type - 字段类型
 *   @property {String} name - 字段显示名称
 *   @property {Array} required - 必填约束及错误提示
 *   @property {Number} minlength - 最小长度限制
 *   @property {Number} maxlength - 最大长度限制
 */
export const searchTaskSchema: SchemaDefinition<ISearchTask> = {
  keywords: {
    type: String,
    name: '搜索任务关键词',
    trim: true,  // 自动去除前后空格
    required: [true, '缺少搜索任务关键词，创建失败'],
    unique: [true, '该搜索任务关键词已被占用'], // 搜索任务关键词唯一
    maxlength: [200, '搜索任务关键词长度不能超过200字符']
  },  
  noteType: {
    type: Number,
    name: '搜索任务查询类型',
    enum:[0,1,2],
    required: [true, '缺少搜索任务查询类型，创建失败'],
  },
  sort: {
    type: Number,
    name: '排序规则',
    enum:[0,1,2],
    required: [true, '缺少排序规则，创建失败'],
  },
  status: {
    type: Number,
    name: '排序规则',
    enum:[0,1,2],
    required: [true, '缺少排序规则，创建失败'],
    default:0,
  },
  totalNumber: {
    type: Number,
    name: '查询总量',
    required: [true, '缺少查询总量，创建失败'],
    min: [1, '查询总量不能小于1'],
    max: [50, '查询总量不能大于50'],
    default: 1
  },
  createdUser: {
    type: String,
    name: '创建用户',
    required: [true, '缺少创建用户信息']
  },
  createdAt: {
    type: Date,
    name: '创建时间',
    required: true,
    default: Date.now, // 默认创建时间为当前时间
    immutable: true,
  },
  updatedUser: {
    type: String,
    name: '更新用户',
    sparse: true,
  },
  updatedAt: {
    type: Date,
    name: '更新时间',
    sparse: true,
  },
}

export default searchTaskSchema 